package com.itbaizhan.routing;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/*路由模式  绑定路由关键字RoutingKey
* 生产者*/
public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.66.101");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("itbaizhan");
        connectionFactory.setPassword("itbaizhan");
        connectionFactory.setVirtualHost("/"); //设置虚拟机，默认是 /

        Connection connection = connectionFactory.newConnection();

        Channel channel = connection.createChannel();
        //创建交换机  declare :声明; 宣布; 宣告; 宣称
        /*
         * 参数1：交换机名
         * 参数2：交换机类型
         * 参数3：交换机持久化*/
        channel.exchangeDeclare("exchange_routing", BuiltinExchangeType.DIRECT,true);
        //创建队列
        /*
         *参数1：队列名
         * 参数2：是否持久化，true表示MQ重启后队列还在
         * 参数3：是否私有化，false表示所有消费者都可以访问  true表示只有第一次拥有它的消费者才可以访问
         * 参数4： 是否自动删除，true表示不再使用队列时自动删除队列
         * 参数5：其他的额外参数
         * */
        channel.queueDeclare("SEND_MAIL2",true,false,false,null);
        channel.queueDeclare("SEND_MESSAGE2",true,false,false,null);
        channel.queueDeclare("SEND_STATION2",true,false,false,null);
        //绑定交换机
        channel.queueBind("SEND_MAIL2","exchange_routing","import");
        channel.queueBind("SEND_MESSAGE2","exchange_routing","import");
        channel.queueBind("SEND_STATION2","exchange_routing","import");
        channel.queueBind("SEND_STATION2","exchange_routing","normal");

        //发送信息
        channel.basicPublish("exchange_routing","import",null,"双十一大促活动".getBytes());
        channel.basicPublish("exchange_routing","normal",null,"小小的促销活动".getBytes());
        channel.close();
        connection.close();
    }
}
/*
使用发布订阅模式时，所有消息都会发送到绑定的队列中，但很多时候，
不是所有消息都无差别的发布到所有队列中。比如电商网站的促销活动，
双十一大促可能会发布到所有队列；而一些小的促销活动为了节约成本，
只发布到站内信队列。此时需要使用路由模式(Routing)完成这一需求。

特点：

每个队列绑定路由关键字RoutingKey
生产者将带有RoutingKey的消息发送给交换机，
交换机根据RoutingKey转发到指定队列。路由模式使用direct交换机。*/